home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 37
/
Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso
/
Aminet
/
dev
/
lang
/
sofa.lha
/
sofa
/
smalleiffel
/
lib_se
/
creation_clause.e
< prev
next >
Wrap
Text File
|
2000-03-25
|
5KB
|
184 lines
-- This file is part of SmallEiffel The GNU Eiffel Compiler.
-- Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
-- Dominique COLNET and Suzanne COLLIN - colnet@loria.fr
-- http://SmallEiffel.loria.fr
-- SmallEiffel is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 2, or (at your option) any later
-- version. SmallEiffel is distributed in the hope that it will be useful,but
-- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-- for more details. You should have received a copy of the GNU General
-- Public License along with SmallEiffel; see the file COPYING. If not,
-- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-- Boston, MA 02111-1307, USA.
--
class CREATION_CLAUSE
--
-- The store the contents of one creation clause.
-- example 1
-- creation {ANY} make
-- example 2
-- creation make, foo
-- example 3
-- creation {NONE,ANY} make, foo
-- example 4
-- creation
--
-- Note : The original text of the source file can be stored
-- for pretty pretty_printing to be fine.
--
inherit GLOBALS;
creation make
feature
start_position: POSITION;
-- Of the corresponding keyword.
clients: CLIENT_LIST;
comment: COMMENT;
feature {NONE}
procedure_list: FEATURE_NAME_LIST;
make(sp: like start_position; c: like clients;
cm: like comment; pl: like procedure_list) is
require
not sp.is_unknown;
c /= Void;
do
start_position := sp;
clients := c;
comment := cm;
procedure_list := pl;
ensure
clients = c;
comment = cm
procedure_list = pl;
end;
feature
pretty_print is
do
fmt.set_indent_level(0);
if not fmt.zen_mode then
fmt.skip(1);
else
fmt.indent;
end;
fmt.keyword("creation");
fmt.set_indent_level(1);
if clients /= Void then
clients.pretty_print;
end;
if comment /= void then
comment.pretty_print;
end;
fmt.set_indent_level(1);
if not fmt.zen_mode then
fmt.indent;
end;
if procedure_list /= Void then
procedure_list.pretty_print;
end;
end;
short(heading_done: BOOLEAN): BOOLEAN is
-- True when at least one creation list is printed.
do
if clients.gives_permission_to_any then
if not heading_done then
short_print.hook_or("hook100","creation%N");
end;
if procedure_list /= Void then
procedure_list.short_for_creation;
end;
short_print.hook_or("hook101","");
Result := true;
else
eh.cancel;
end;
end;
has(fn: FEATURE_NAME): BOOLEAN is
require
fn /= Void
do
if procedure_list /= Void then
Result := procedure_list.has(fn);
end;
end;
feature {CREATION_CLAUSE_LIST}
root_procedure_name(procedure_name: STRING): SIMPLE_FEATURE_NAME is
do
if procedure_list = Void then
else
Result := procedure_list.root_procedure_name(procedure_name);
end;
end;
check_expanded_with(t: TYPE) is
require
t.is_expanded;
local
rf: RUN_FEATURE;
rf3: RUN_FEATURE_3;
rc: RUN_CLASS;
do
if procedure_list = Void then
eh.add_position(start_position);
fatal_error("Cannot create a class with an empty creation list.");
end;
if procedure_list.count > 1 then
eh.add_type(t,fz_cbe);
eh.add_position(start_position);
fatal_error_vtec_2;
end;
rc := t.run_class;
rf := rc.get_feature(procedure_list.item(1));
if rf = Void then
eh.add_position(start_position);
eh.append("Creation procedure for ");
eh.add_type(t," not found.");
eh.print_as_fatal_error;
end;
rf3 ?= rf;
if rf3 = Void then
eh.add_position(start_position);
eh.add_position(rf.start_position);
fatal_error("Feature found is not a procedure.");
end;
if rf3.arguments /= Void then
eh.add_type(t,fz_cbe);
eh.add_position(start_position);
eh.add_position(rf3.start_position);
eh.append("Procedure found has arguments. ");
fatal_error_vtec_2;
end;
end;
expanded_initializer(t: TYPE): RUN_FEATURE_3 is
require
t.is_expanded;
not t.is_basic_eiffel_expanded
do
if procedure_list /= Void then
Result ?= t.run_class.get_feature(procedure_list.item(1));
end;
end;
invariant
clients /= Void;
end -- CREATION_CLAUSE